perm filename FILER[NS,SYS] blob sn#118925 filedate 1974-09-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Definitions.  The file DEFS must be assembled with this file.
C00004 00003	Storage allocations.
C00009 00004	MAIN	NEWFIL	GETTTY
C00016 00005	END1
C00019 00006	GETCH	PUTCH	PUTSTR
C00022 00007	UUCODE	NXTDG	CHGWIR
C00024 00008	CHGNAM	INTRPT
C00026 00009	APCODE	NYCODE
C00032 00010	SETSHF	CLRSHF	SPE1-7	CKPARA	SPE0
C00034 00011	FILER
C00036 00012	CHKTEM
C00039 ENDMK
C⊗;
;Definitions.  The file DEFS must be assembled with this file.

	TITLE	FILER of wire news services' news

;BUFCNT←←1	;TYPE OUT NUMBER OF CHARS IN EACH BUFFER FROM TTY12

IFNDEF DEBUG <DEBUG←←0>
IFNDEF BUFCNT <BUFCNT←←0>

;     ACCUMULATOR ASSIGNMENTS
F←0	;unused
A←1		;TEMPORARY AC
B←2		;TEMPORARY AC
C←3		;CURRENT CHAR
D←4	;unused
E←5		;LF COUNTER--USED TO DETECT END OF STORY

L←6		;LAST CHAR SEEN
M←7		;NUMBER OF COLS OUTPUT SO FAR ON CURRENT LINE
N←10		;NUMBER OF FREE BYTES LEFT IN OUTPUT BUFFER

Q←11	;unused
R←12		;CODE OF CURRENT WIRE BEING SERVICED

W←13		;W,X,Y,Z ARE USED AS LOOKUP/ENTER BLOCK
X←14
Y←15
Z←16

P←17		;pdl pointer

I←←0		;CHANNEL FOR TTY12 INPUT
T←←10		;CHANNEL FOR OUTPUT TEXT FILE
T1←←17		;CHANNEL FOR LOOKING UP OLD OUTPUT FILE TO SEE IF IT IS GONE
;Storage allocations.

DEFINE EACH {FOR @! N ε {01}}	;LIST OF WIRE NUMBERS

	'HOT'			;CODE WORD FOR HOT TO LOCATE HOTLINE BUFFERS
SBUF:	EACH {
SBUF!N:	BLOCK LSPCL}

SPOINT:	EACH {
SPTR!N:	POINT 7,SBUF!N}

SCOUNT:	EACH {
	(LSPCL-2)*5}

SFRONT:	EACH {
	POINT 7,SBUF!N}

;XWIRES IS DEFINED IN DEFS AND SETS UP WIRES AND NWIRES
XWIRES

CODE:	C,,NYCODE
	C,,APCODE
MASK:	140	;BITS THAT SHOULDN'T BE ON IN NYT CHAR
	100	; "    "     "       "  "  "  AP   "

;HERE ARE THE OUTPUT BUFFER HEADERS AND OUTPUT BUFFERS FOR EACH WIRE
EACH
{OBUF!N: BLOCK 3
 BUF!N:  BLOCK 3+200+1
}

BUFMAX←←=95	;MAXIMUM NUMBER OF CHARS THE SYSTEM TTY INPUT BUFFERS WILL HOLD
NIBUFS←←1	;NUMBER OF USER INPUT BUFFERS PER INPUT WIRE
BUFLN←←30	;DEFAULT USER TTY BUFFER SIZE
EACH
{IBUF!N: BLOCK 3
}
TTYBUF::	;HERE ARE THE INPUT BUFFERS FOR THE INPUT WIRES
EACH
{TTBF!N: BLOCK NIBUFS*(BUFLN+3)
}

;INDIRECT POINTERS TO INPUT BYTE COUNTS
ICOUNT: EACH
{IBUF!N + 2
}

;INDIRECT POINTERS TO INPUT BYTE POINTERS
IPOINT:	EACH
{IBUF!N + 1
}

;INDIRECT POINTERS TO OUTPUT BYTE COUNT
OCOUNT: EACH
{OBUF!N + 2
}

;INDIRECT POINTERS TO OUTPUT BYTE POINTERS
OPOINT:	EACH
{OBUF!N + 1
}

;flag indicating upper or lower shift characters
SHIFT:	EACH
{SHIFT!N:: 0
}

;NAMES OF PREVIOUS TFL FILE FOR EACH WIRE
OLDNAM:	EACH
{OLDNM!N:: 0
}

;PLACE TO SAVE PC FOR EACH WIRE'S CO-ROUTINE
PC:	EACH
{NEWFIL
}

TTSKIP:	EACH
{TTYSKP N,
}

;PLACE TO SAVE ONE AC FOR EACH WIRE'S CO-ROUTINE
ESAVE:	EACH
{0
}

;NAMES OF CURRENT TEM (TFL) FILE FOR EACH WIRE
TEMNAM:	EACH
{TEMNM!N:: 0
}

IIN:	EACH
{	IN	N,
}

TINIT:	EACH
{	INIT	T+N,200
}

TENTER:	EACH
{	ENTER	T+N,W
}

TOUTBF:	EACH
{	OUTBUF	T+N,1
}

TLOOKP:	EACH
{	LOOKUP	T+N,W
}

TOUT:	EACH
{	OUT	T+N,
}

;MTAPE UUO TO UPDATE RETRIEVAL OF CURRENT TEM (TFL) FILES
TMTAPE:	EACH
{	MTAPE	T+N,['GODMOD'↔17]
}

TCLOSE:	EACH
{	CLOSE	T+N,
}

TRENAM:	EACH
{	RENAME	T+N,W
}

TRELEA:	EACH
{	RELEAS	T+N,
}

LPDL←←10
PDL:	BLOCK	LPDL	;area for stack

DSK17:	217		;block used for opening the dsk in mode 17 many times
	SIXBIT	/DSK/	;200 bit means take error return automatically
	0		;if DISK IS FULL or BAD RETRIEVAL

DONAME:	SIXBIT /[DOER]/

DOER:	SIXBIT	/DSK/	;block used to start up DOER
	SIXBIT	/DOER/	;program name goes here
	'DMP',,14	;USE NEW JOB and dont set JLOG
	0		;normal starting address, normal core assignment
	NSPPN		;PPN OF DOER.DMP
	0		;LOG DOER IN UNDER SAME PPN FILER IS USING

ERRBK:	SIXBIT	/DSK/	;block used to start up error-handling program
	ERRPRG		;program name goes here
	'DMP',,0
	1		;NORMAL CORE SIZE, RPG STARTUP (SA+1)
	NSPPN

CRLF:	ASCIZ	/
/

MYNAME:	SIXBIT /[-NS-]/
;MAIN	NEWFIL	GETTTY

MAIN:	CORE	A,		;CORE DOWN, DISCARDING INITIALIZATION CODE
	JFCL			;CANT CORE DOWN

NEWFIL:	LOCK	W,		;LOCK JOB IN CORE!

	XCT	TINIT(R)
	SIXBIT	/DSK/
	0
	UFATAL	16		;;;CANT INIT DSK

	ACCTIM	W,		;USE <DATE>,,<TIME> AS FILENAME
	HLRZ	X,W		;GET DATE
	DAYCNT	X,		;CONVERT TO DAYCNT FORMAT
	HRL	W,X
	MOVSI	X,'TEM'
	SETZ	Y,
	MOVE	Z,WIRES(R)	;PPN OF THIS WIRE SERVICE
	XCT	TENTER(R)
	AOJA	W,[XCT TENTER(R);TRY AT MOST TWICE TO DO AN ENTER
		UDELAY	1,20	;;;CANT ENTER OUTPUT FILE (.TEM)
		JRST .+1]
	MOVEM	W,TEMNAM(R)	;SAVE NAME OF CURRENT FILE

	MOVE	B,OPOINT(R)	;ADDRESS OF BYTE POINTER IN BUFFER HEADER
	SUBI	B,1		; MAKE INTO ADDRESS OF BUFFER HEADER
	HRLZM	B,HDRPTR
	XCT	TINIT(R)	;RELEASE NEW FILE AND OPEN IN RA MODE
	SIXBIT	/DSK/
HDRPTR:	OBUF0,,0
	UFATAL	22		;;;CANT INIT DSK

	HRRZ	B,OCOUNT(R)	;PTR TO BYTE COUNT WHICH IS WORD BEFORE OUTPUT BUFFER
	ADDI	B,1		;MAKE PTR TO BUFFER
	EXCH	B,JOBFF↑
	XCT	TOUTBF(R)	;SET UP OUTPUT BUFFER
	MOVEM	B,JOBFF

	MOVE	Z,WIRES(R)	;PPN
	XCT	TLOOKP(R)	;LOOKUP NEW (EMPTY) FILE
	UFATAL	24		;;;CANT LOOKUP NEW OUTPUT FILE
	MOVE	Z,WIRES(R)
	XCT	TENTER(R)	;OPEN FOR OUTPUT IN RA MODE
	UFATAL	26		;;;CANT OPEN NEW OUTPUT FILE IN RA MODE

GETTTY:	MOVEI	E,2
	JRST	GETCH		;GET AP CHAR AND OUTPUT IT
GETRET:	CAIE	C,LF		;LOOK FOR 3 STRAIGHT LFs (GETCH RETURNS HERE)
	MOVEI	E,3		;HAVEN'T SEEN ANY YET
	SOJGE	E,GETCH
;END1

	MOVEI	C,200		;MAKE SURE STORY ENDS WITH NULL
	PUSHJ	P,PUTCH3	; (BUT DONT PUT NULL INTO HOTLINE BUFFER)

	XCT	TOUT(R)		;PUT OUT LAST PARTIAL BUFFER
	AOSA	@OCOUNT(R)	;KEEP BYTE COUNT ACCURATE
	UFATAL	30		;;;OUT UUO FAILED TO OUTPUT LAST RECORD OF STORY
	XCT	TMTAPE(R)	;AND UPDATE RETRIEVAL

	OPEN	T1,DSK17
	UFATAL	32		;;;CANT OPEN DSK
	MOVE	W,OLDNAM(R)
	MOVSI	X,'TFL'
	MOVE	Z,WIRES(R)	;PPN
	SETZ	C,		;FLAG--ASSUME FILE FOUND
	LOOKUP	T1,W		;LOOK FOR PREVIOUS OUTPUT FILE
	SETO	C,		;APPARENTLY NOT THERE
	RELEAS	T1,
	JUMPE	C,END2		;JUMP IF OLD FILE STILL THERE. USE SAME TEM FILE

	XCT	TCLOSE(R)	;PREVIOUS FILE GONE.  CLOSE CURRENT FILE.
	MOVE	W,TEMNAM(R)	;GET NAME OF CURRENT OUTPUT FILE
END1:	MOVSI	X,'TFL'
	SETZ	Y,
	MOVE	Z,WIRES(R)	;PPN
	XCT	TRENAM(R)	;RENAME .TFL←.TEM
	UFATAL	34		;;;CANT RENAME TEM FILE TO TFL
	XCT	TRELEA(R)
	MOVEM	W,OLDNAM(R)	;SAVE NAME OF THIS FILE

END2:	MOVEI	B,DOER		;think about starting up DOER
	MOVE	A,DONAME	;see if a DOER job exists
	NAMEIN	A,
	ORI	A,400		;NOTE THAT NAMEIN FAILED (NO UNIQUE DOER)
	CAIN	A,401		;CHECK ERROR CODE
	SWAP	B,		;NO DOERS.  START ONE UP
	JUMPE	C,GETTTY	;NO NEW FILE YET
	JRST	NEWFIL		;GO OPEN A NEW OUTPUT FILE
;GETCH	PUTCH	PUTSTR

GETCH:	SOSLE	@ICOUNT(R)	;ANY CHARS IN INPUT BUFFER
	JRST	GETCH1		;YES.  GET ONE.
	PUSHJ	P,CHGWIR
	XCT	IIN(R)		;NO.  GET NEW BUFFER
	JRST	GETCH2
	UFATAL	36		;;;INPUT ERROR FROM TTY12

GETCH2:	MOVE	A,@ICOUNT(R)	;GET NUMBER OF CHARS IN BUFFER
IFN BUFCNT <
	PUSHJ	P,NXTDG
	OUTCHR	[" "]
	MOVE	A,@ICOUNT(R)
>;END IFN BUFCNT
	CAIGE	A,BUFMAX
	JRST	GETCH1		;NOT FULL BUFFER
	MOVEI	A,[ASCIZ/...
/]				;FULL BUFFER--ASSUME WE MISSED SOME CHARS
	PUSHJ	P,PUTSTR	;INSERT "...CRLF"

GETCH1:	ILDB	C,@IPOINT(R)
	TDNE	C,MASK(R)
	JRST	[MOVEI C,"%"	;FUNNY BIT ON IN WIRE CHAR
		JRST GETCH3]	;PUT OUT FUNNY CHAR
	ADD	C,SHIFT(R)	;ACCOUNT FOR CURRENT SHIFT SETTING
	XCT	@CODE(R)	;CONVERT FROM TTS CODES TO ASCII
	JUMPE	C,GETCH		;NO NULLS PLEASE
GETCH3:	PUSHJ	P,PUTCH
	JRST	GETRET		;RETURN FROM GETCH

PUTCH0:	MOVE	B,SFRONT(R)	;BYTE PTR TO FRONT OF HOTLINE BUFFER
	SETZM	(B)		;CLEAR FIRST WORD
	MOVEM	B,SPOINT(R)	;SET UP BYTE PTR INTO HOTLINE BUFFER
	MOVEI	B,(LSPCL-2)*5	;NUMBER OF CHARS HOTLINE BUFFER WILL HOLD
	MOVEM	B,SCOUNT(R)	;SET UP BYTE COUNT
	JRST	PUTCH2

PUTCH:	SOSG	SCOUNT(R)	;ANY ROOM LEFT IN HOTLINE BUFFER?
	JRST	PUTCH0		;NO, MOVE TO TOP OF HOTLINE BUFFER
	MOVE	B,SPOINT(R)	;BYTE POINTER INTO HOTLINE BUFFER
	SETZM	1(B)		;CLEAR NEXT WORD
PUTCH2:	IDPB	C,SPOINT(R)	;PUT CHAR INTO HOTLINE BUFFER

PUTCH3:	SOSG	@OCOUNT(R)	;ANY ROOM LEFT IN OUTPUT BUFFER?
	XCT	TOUT(R)		;WRITE OUT BUFFER
	JRST	PUTCH1		;YES
	UFATAL	40		;;;DISK OUTPUT ERROR
PUTCH1:	IDPB	C,@OPOINT(R)
	POPJ	P,

PUTSTR:	TLOA	A,440700	;MAKE A BYTE POINTER
PUTST1:	PUSHJ	P,PUTCH
	ILDB	C,A
	JUMPN	C,PUTST1
	POPJ	P,
;UUCODE	NXTDG	CHGWIR

UUCODE:	0
	SETO	A,
	GETLIN	A
	AOJE	A,DET
	OUTSTR	[ASCIZ /
FILER error #/]
	HRRZ	A,40		;get error number
	PUSHJ	P,NXTDG		;TYPE OUT ERROR NUMBER
	EXIT	1,
	HALT	.
	JRST	@UUCODE

DET:	RESET
	MOVE	0,R		;PASS WIRE CODE IN AC 0
	MOVE	1,MYNAME	; JOB NAME IN AC 1
	MOVE	2,40		; AND ERROR UUO IN AC 2
	MOVEI	16,ERRBK
	SWAP	16,
	EXIT

NXTDG:	IDIVI	A,=8		;convert number in A to octal ASCII string
	HRLM	B,(P)
	JUMPE	A,.+2
	PUSHJ	P,NXTDG
	HLRZ	A,(P)
	ADDI	A,"0"
	OUTCHR	A
	POPJ	P,

CHGWIR:	MOVEM	R,RSAVE#
	POP	P,PC(R)
	MOVEM	E,ESAVE(R)	;SAVE AN AC FOR THE OLD WIRE
CHGWR1:	IMSKCL	1,[INTTTY,,0]	;MASK OFF TTY INTERRUPTS
CHGWR0:	SOJGE	R,.+2		;NEXT WIRE PLEASE
	MOVEI	R,NWIRES-1	; START OVER WITH FIRST WIRE
	XCT	TTSKIP(R)	;ANY INPUT FOR THIS WIRE?
	JRST	CHGWR2		;NO
	MOVE	E,ESAVE(R)	;YES, RESTORE AN AC FOR THE NEW WIRE
	INTMSK	[-1]		;MASK TTY INTERRUPTS BACK ON
	JRST	@PC(R)

CHGWR2:	CAME	R,RSAVE		;HAVE WE TRIED ALL WIRES?
	JRST	CHGWR0		;NO, TRY NEXT ONE
	IMSTW	[-1]		;YES, MASK TTY INTERRUPTS ON AND GO TO SLEEP
	JRST	CHGWR1
;CHGNAM	INTRPT

;interrupt level routine to set the job name
CHGNAM:	MOVEI	A,INTRP2
	MOVEM	A,JOBAPR		;FUTURE INTERRUPTS GO TO DIFFERENT PLACE
	MOVSI	A,INTPTI		;disable name change interrupts
	INTACM	A,
	SETZ	A,			;zero out own job name
	SETNAM	A,
	SETOM	NBRFLR#			;initialize indicator to one other filer
	MOVE	A,MYNAME		;get filer's name from wakeme block
	NAMEIN	A,
	JRST	.+2			;zero or multiple filers exist
	DISMIS				;one other filer exists
	SETZM	NBRFLR			;set indicator to multiple filers
	CAIE	A,1			;check error code of NAMEIN
	DISMIS				;two or more other filers exist
	AOS	NBRFLR			;set indicator to no other filers
	MOVE	A,MYNAME		;change job name
	SETNAM	A,
	MOVEI	A,200000
	INTACM	A,			;disable for further pdl ov ints
	DISMIS

;interrupt level module
INTRPT:	MOVS	A,JOBCNI↑	;get bit causing interrupt
	CAIN	A,INTPTI	;is this interrupt to set filer's job name?
	JRST	CHGNAM		;yes.  do it
INTRP2:	MOVS	A,JOBCNI↑
	CAIE	A,INTPAR
	DISMIS			;IGNORE STRANGE INTERRUPT
	UWAIT			;PARITY ERROR.  GIVE UP AND GO HOME
	JRST	2,@[.+1]	;get out of user-iot
	DEBREAK
	EXIT			;PARITY ERROR IN FILER
;APCODE	NYCODE

APCODE:	JRST	GETCH		;0: tape feed
	MOVEI	C,"e"	;1
	MOVEI	C,LF		;2: elevate→line feed
	MOVEI	C,"a"	;3
	JRST	CKPARA		;4: space.  make into 4 spaces if after LF
	MOVEI	C,"s"	;5
	MOVEI	C,"i"	;6
	MOVEI	C,"u"	;7
	MOVEI	C,CR		;10: carriage return
	MOVEI	C,"d"	;11
	MOVEI	C,"r"	;12
	MOVEI	C,"j"	;13
	MOVEI	C,"n"	;14
	MOVEI	C,"f"	;15
	MOVEI	C,"c"	;16
	MOVEI	C,"k"	;17
	MOVEI	C,"t"	;20
	MOVEI	C,"z"	;21
	MOVEI	C,"l"	;22
	MOVEI	C,"w"	;23
	MOVEI	C,"h"	;24
	MOVEI	C,"y"	;25
	MOVEI	C,"p"	;26
	MOVEI	C,"q"	;27
	MOVEI	C,"o"	;30
	MOVEI	C,"b"	;31
	MOVEI	C,"g"	;32
	JRST	SETSHF		;33: shift
	MOVEI	C,"m"	;34
	MOVEI	C,"x"	;35
	MOVEI	C,"v"	;36
	JRST	CLRSHF		;37: unshift

	JRST	CKPARA		;40: thin space→space
	MOVEI	C,"3"	;41
	MOVEI	C,LF		;42: paper feed→line feed
	MOVEI	C,"$"	;43
	JRST	CKPARA		;44: add thin space→space
	JRST	CKPARA		;45: em space→space
	MOVEI	C,"8"	;46
	MOVEI	C,"7"	;47
	MOVEI	C,"'"	;50
	MOVEI	C,"-"	;51
	MOVEI	C,"4"	;52
	JRST	GETCH		;53: bell
	MOVEI	C,","	;54: comma
	JRST	GETCH		;55: undefined
	JRST	CKPARA		;56: en space→space
	JRST	GETCH		;57: quad right
	MOVEI	C,"5"	;60
	MOVEI	C,")"	;61
	JRST	CKPARA		;62: em space→space
	MOVEI	C,"2"	;63
	JRST	GETCH		;64: em leader
	MOVEI	C,"6"	;65
	MOVEI	C,"0"	;66
	JRST	GETCH		;67: en leader
	MOVEI	C,"9"	;70
	JRST	GETCH		;71: upper rail
	MOVEI	C,";"	;72
	JRST	GETCH		;73: lower rail
	MOVEI	C,"."	;74: period
	MOVEI	C,"1"	;75
	JRST	GETCH		;76: undefined
	JRST	GETCH		;77: rub out


;NY LOWER CASE, AP UPPER CASE
NYCODE:	JRST	GETCH		;0: tape feed
	MOVEI	C,"E"	;1
	MOVEI	C,LF		;2: elevate→line feed
	MOVEI	C,"A"	;3
	JRST	CKPARA		;4: space.  make into 4 spaces if after LF
	MOVEI	C,"S"	;5
	MOVEI	C,"I"	;6
	MOVEI	C,"U"	;7
	MOVEI	C,CR		;10: carriage return
	MOVEI	C,"D"	;11
	MOVEI	C,"R"	;12
	MOVEI	C,"J"	;13
	MOVEI	C,"N"	;14
	MOVEI	C,"F"	;15
	MOVEI	C,"C"	;16
	MOVEI	C,"K"	;17
	MOVEI	C,"T"	;20
	MOVEI	C,"Z"	;21
	MOVEI	C,"L"	;22
	MOVEI	C,"W"	;23
	MOVEI	C,"H"	;24
	MOVEI	C,"Y"	;25
	MOVEI	C,"P"	;26
	MOVEI	C,"Q"	;27
	MOVEI	C,"O"	;30
	MOVEI	C,"B"	;31
	MOVEI	C,"G"	;32
	JRST	SETSHF		;33: shift
	MOVEI	C,"M"	;34
	MOVEI	C,"X"	;35
	MOVEI	C,"V"	;36
	JRST	CLRSHF		;37: unshift

	JRST	CKPARA		;40: thin space→space
	JRST	SPE3		;41: 3/8
	MOVEI	C,LF		;42: paper feed→line feed
	MOVEI	C,"!"	;43
	JRST	CKPARA		;44: add thin space→space
	JRST	CKPARA		;45: em space→space
	MOVEI	C,"-"	;46
	JRST	SPE7		;47: 7/8
	MOVEI	C,"'"	;50: left quote→right quote (ttys dont have left quote)
	MOVEI	C,"+"	;51
	JRST	SPE4		;52: 1/2
	JRST	GETCH		;53: bell
	MOVEI	C,","	;54: comma
	JRST	GETCH		;55: undefined
	JRST	CKPARA		;56: en space→space
	JRST	GETCH		;57: quad right
	JRST	SPE5		;60: 5/8
	MOVEI	C,"("	;61
	JRST	CKPARA		;62: em space→space
	JRST	SPE2		;63: 1/4
	JRST	GETCH		;64: em leader
	JRST	SPE6		;65: 3/4
	MOVEI	C,"?"	;66
	JRST	GETCH		;67: en leader
	MOVEI	C,"&"	;70
	JRST	GETCH		;71: upper rail
	MOVEI	C,":"	;72
	JRST	GETCH		;73: lower rail
	MOVEI	C,"."	;74: period
	JRST	SPE1		;75: 1/8
	JRST	GETCH		;76: undefined
	JRST	GETCH		;77: rub out

;NY FIGS
	JRST	GETCH		;00
	MOVEI	C,"3"	;01
	MOVEI	C,LF		;02: PAPER FEED→LINE FEED
	MOVEI	C,"-"	;43
	MOVEI	C," "		;SPACE
	JRST	GETCH		;05: BELL
	MOVEI	C,"8"	;46
	MOVEI	C,"7"	;47
	MOVEI	C,CR	;50
	MOVEI	C,"$"	;51
	MOVEI	C,"4"	;52
	MOVEI	C,47		;13: SINGLE QUOTE
	MOVEI	C,","	;54: comma
	MOVEI	C,"!"	;55: EXCLAMATION POINT
	MOVEI	C,":"	;16: COLON
	MOVEI	C,"("	;17: LEFT PAREN
	MOVEI	C,"5"	;60
	MOVEI	C,42	
	MOVEI	C,")"	;61
	MOVEI	C,"2"	;63
	JRST	GETCH		;64
	MOVEI	C,"6"	;65
	MOVEI	C,"0"	;66
	MOVEI	C,"1"	;75
	MOVEI	C,"9"	;70
	MOVEI	C,"?"	;72
	MOVEI	C,"&"	;74
	JRST	SETSHF	;SHIFT
	MOVEI	C,"."	;PERIOD
	MOVEI	C,"/"
	MOVEI	C,";"
	JRST	CLRSHF	;UNSHIFT
;SETSHF	CLRSHF	SPE1-7	CKPARA	SPE0

CLRSHF:	TDZA	C,C
SETSHF:	MOVEI	C,100
	MOVEM	C,SHIFT(R)
	JRST	GETCH

SPE1:	MOVEI	A,[ASCIZ ⊗ 1/8⊗]
	JRST	SPE0
SPE2:	MOVEI	A,[ASCIZ ⊗ 1/4⊗]
	JRST	SPE0
SPE3:	MOVEI	A,[ASCIZ ⊗ 3/8⊗]
	JRST	SPE0
SPE4:	MOVEI	A,[ASCIZ ⊗ 1/2⊗]
	JRST	SPE0
SPE5:	MOVEI	A,[ASCIZ ⊗ 5/8⊗]
	JRST	SPE0
SPE6:	MOVEI	A,[ASCIZ ⊗ 3/4⊗]
	JRST	SPE0
SPE7:	MOVEI	A,[ASCIZ ⊗ 7/8⊗]
	JRST	SPE0

CKPARA:	MOVEI	C," "
	CAIN	R,1		;ONLY AP GETS EXTRA SPACES
	CAILE	E,1		;if the previous char was a LF, CNT will be 1
	JRST	GETCH3		;not after LF--put out a space
	MOVEI	A,[ASCIZ ⊗    ⊗]	;AFTER LF--PUT OUT FOUR SPACES

SPE0:	PUSHJ	P,PUTSTR
	JRST	GETRET

	XLIST
	VAR
	LIT
	LIST
;FILER

FILER:	RESET
	MOVE	P,[IOWD LPDL,PDL];initialize pdl pointer
	MOVEI	A,INTRPT	;get address of interrupt level module
	MOVEM	A,JOBAPR↑	;store it
	MOVSI	A,INTPTI!INTPAR!INTTTY	;enable interrupts on parity errors
	INTENB	A,		;	and pty input AND TTY INPUT
	MOVSI	A,INTPTI
	INTGEN	A,		;generate a pty input int to set the job name
	MOVE	A,NBRFLR	;get code indicating number of other filers
	JRST	.+2(A)
	EXIT			;ONE OTHER FILER ALREADY EXISTED
	UFATAL	2		;;;TWO OR MORE OTHER FILERS ALREADY EXISTED

	INIT	I,411		;grab NYT news line, take error return if not avail
	SIXBIT	/TTY13/
	IBUF0
	UDELAY	2,4		;;;INIT FAILED ON TTY12

	INIT	I+1,411		;grab AP news line, take error return if not avail
	SIXBIT	/TTY12/
	IBUF1
	UDELAY	2,5		;;;INIT FAILED ON TTY13

	MOVSI	A,000700	;7-BIT BYTES FOR EACH INPUT WIRE
EACH
{	MOVEM	A,IBUF!N+1
}

	MOVEI	B,TTYBUF	;set up buffers for input wires at TTYBUF
	EXCH	B,JOBFF↑
EACH
{	INBUF	N,NIBUFS
}
	MOVEM	B,JOBFF		;restore old value of JOBFF

EACH
{	SETZM	OLDNM!N		;ZERO NAME OF PREVIOUS OUTPUT FILE
}
EACH
{	SETZM	SHIFT!N
}
;CHKTEM

	INIT	T1,210		;LOOK AT UFD FOR A .TEM FILE TO RENAME TO .TFL
	SIXBIT	/DSK/
	OBUF0			;ACTUALLY INPUT BUFFER HEADER
	UFATAL	6		;;;CANT INIT DSK

	MOVEI	B,BUF0
	EXCH	B,JOBFF↑
	INBUF	T1,1
	MOVEM	B,JOBFF

	MOVEI	R,1		;LOOK FOR TEM FILES ON EACH WIRE'S AREA
CHKTE0:	MOVE	W,WIRES(R)
	MOVSI	X,'UFD'
	MOVE	Z,['  1  1']
	LOOKUP	T1,W		;LOOKUP UFD
	UFATAL	10		;;;CANT LOOKUP UFD
	MOVEI	A,2
	MOVNI	B,4
CHKTEM:	IN	T1,
	JRST	CHKTE1
	STATO	T1,20000
	UFATAL	12		;;;DISK INPUT ERROR FROM READING UFD
CHKTE3:	SOJGE	R,CHKTE0
	JRST	CLSUFD

CHKTE1:	ILDB	W,OBUF0+1	;get filename from UFD
	ILDB	X,OBUF0+1	;get extension
	ADDM	A,OBUF0+1	;skip last two words of each UFD entry
	HLLZ	X,X
	CAMN	X,['TEM   ']	;is this a .TEM file?
	TDNE	W,[760000,,400000]	;ANY OF THESE BITS ON MEANS CANT BE OURS
	JRST	CHKTE2
	MOVE	Z,WIRES(R)	;GOT A TEM FILE
	OPEN	T,DSK17
	UFATAL	14		;;;CANT OPEN DSK
	LOOKUP	T,W
	JRST	CHKTE2		;IF CANT OPEN IT, IGNORE IT
	MOVSI	X,'TFL'
	SETZ	Y,
	MOVE	Z,WIRES(R)
	RENAME	T,W		;MAKE IT A TFL FILE
	UFATAL	15		;;;CANT RENAME OLD TEM FILE TO TFL
	CLOSE	T,
	MOVEM	W,OLDNAM(R)
	JRST	CHKTE3

CHKTE2:	ADDM	B,OBUF0+2	;DECREMENT BUFFER HEADER BYTE COUNT
	SKIPLE	OBUF0+2		;ANYTHING ELSE IN BUFFER?
	JRST	CHKTE1		;YES
	JRST	CHKTEM

CLSUFD:	RELEAS	T1,
	SETZM	BUF0		;CLEAR OUTPUT BUFFERS FOR HOT
	MOVE	A,[BUF0,,BUF0+1]
	BLT	A,BUF0+203-1
	MOVEI	A,DOER
	SWAP	A,

	MOVEI	R,1		;START WITH AP LINE

IFE DEBUG, <
	MOVEI	A,FILER-1	;ADDRESS WE CAN CORE DOWN TO NOW
	JRST	MAIN		;NOT DEBUGGING: CORE DOWN
>
IFN DEBUG, <
	JRST	NEWFIL		;DEBUGGING: DON'T CORE DOWN
>

	END	FILER